/**
 * Course控制器模块
 */

const express = require("express");

const util = require("../common/util");
/**
 * @typedef {CourseDB}
 */
const CourseDB = require("../model/sqlite/course");

/**
 * 新增课程信息
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function add(req, res) {
    (async function () {
        //FIXME:req.body的数据安全性校验
        let course = {
            teacherId: req.body.teacherId,
            name: req.body.name,
            subject: req.body.subject,
            category: req.body.category,
            price: req.body.price,
            difficulty: req.body.difficulty,
            role: req.body.role,
            des: req.body.des,
            avatar: req.body.avatar,
            createdTime: Date.now(),
            updatedTime: Date.now(),
            status: req.body.status || 0, // 设置默认值，如果未提供则为0
            averageRating: req.body.averageRating || 0.0, // 设置默认值，如果未提供则为0.0
            ratingCount: req.body.ratingCount || 0, // 设置默认值，如果未提供则为0
        };
        let db = CourseDB.getInstance();
        await db.connect();
        let result = await db.add(course);
        //await db.close();
        util.log(`新增课程信息：lastID->${result}`);
        res.json(util.FormatJSONData(201, `课程添加成功`, { lastID: result }));
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500, "服务器发生意外情况，无法完成请求！"));
    });
}

/**
 * 删除课程信息
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function remove(req, res) {
    (async function () {
        //FIXME:数据合法性校验
        let courseId = req.params.id;
        let db = CourseDB.getInstance();
        await db.connect();
        let result = await db.remove(courseId);
        //await db.close();
        util.log(`删除课程信息：changes->${result}`);
        res.json(util.FormatJSONData(204, `删除课程信息`, { changes: result }));
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500, "服务器发生意外情况，无法完成请求！"));
    });
}

/**
 * 更新课程信息
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function update(req, res) {
    (async function () {
        //FIXME:req.body的数据安全性校验
        let review = {
            id: req.params.id,
            name: req.body.name,
            price: req.body.price,
            role: req.body.role,
            des: req.body.des,
            avatar: req.body.avatar,
            status: req.body.status,
            updatedTime: Date.now(),
        };

        let db = CourseDB.getInstance();
        await db.connect();
        let result = await db.update(review);
        //await db.close();
        util.log(`更新指定课程信息：changes->${result}`);
        res.json(util.FormatJSONData(200, `更新指定课程信息`, { changes: result }));
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500, "服务器发生意外情况，无法完成请求！"));
    });
}

/**
 * 获取指定ID的课程信息
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function find(req, res) {
    (async function () {
        let db = CourseDB.getInstance();
        await db.connect();
        let result = await db.find(req.params.id);
        //await db.close();
        util.logFormat(`获取【${req.params.id}】课程信息%O`, result);
        res.json(
            util.FormatJSONData(200, `获取课程信息【${req.params.id}】`, result)
        );
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500, "服务器发生意外情况，无法完成请求！"));
    });
}

/**
 * 获取课程信息列表
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function findAll(req, res) {
    (async function () {
        //1.处理输入的数据
        //FIXME: 输入数据的正确性校验，一致性校验，完整性校验
        let limit = req.query.limit ? req.query.limit : -1;
        let offset = req.query.offset ? req.query.offset : -1;
        let orderBy = req.query.orderBy ? req.query.orderBy : "id";
        let sort = req.query.sort ? req.query.sort : "DESC";
        //2. 访问数据
        let db = CourseDB.getInstance();
        await db.connect();
        let result = await db.findAll(limit, offset, orderBy, sort);
        //await db.close();

        //3.输出数据
        util.logFormat(`获取【limit=${limit}&offset=${offset}】课程信息%O`, result);
        res.json(util.FormatJSONData(200, `获取课程信息列表`, result));
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500, "服务器发生意外情况，无法完成请求！"));
    });
}

/**
 * 获取课程总数
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function getCount(req, res) {
    (async function () {
        let db = CourseDB.getInstance();
        await db.connect();
        let result = await db.getCount();
        //await db.close();
        util.log(`获取课程总数：${result}`);
        res.json(util.FormatJSONData(200, `获取课程总数信息`, result));
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500, "服务器发生意外情况，无法完成请求！"));
    });
}

/**
* 按关键搜索课程信息
* @param {express.Request} req  请求
* @param {express.Response} res  响应
*/
function search(req, res) {
    (async function () {
        // 1. 处理输入的数据
        // 处理输入的数据
        //FIXME: 输入数据的正确性校验，一致性校验，完整性校验
        // TODO: 需要添加输入数据的正确性校验、一致性校验和完整性校验
        let q = req.query.q;
        let limit = req.query.limit ? req.query.limit : -1;
        let offset = req.query.offset ? req.query.offset : -1;

        // 2. 访问数据
        // 获取数据库实例
        let db = CourseDB.getInstance();
        // 连接数据库
        await db.connect();
        // 搜索课程信息
        let result = await db.search(q, limit, offset);
        //await db.close();

        // 3. 输出数据
        // 打印日志
        util.logFormat(`获取关键字(课程名/课程学科体系/课程分类)为【${q}】【limit=${limit}&offset=${offset}】课程信息%O`, result);
        // 格式化并输出JSON数据
        res.json(util.FormatJSONData(200, `获取指定关键字的课程信息列表`, result));
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500, "服务器发生意外情况，无法完成请求！"));
    });
}


/**
 * 获取指定教师ID的课程信息列表
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function findAllByTeacherId(req, res) {
    (async function () {
        // 1. 处理输入的数据
        // 1.1 从请求中获取教师ID，若不存在则赋值为-1
        //FIXME: 输入数据的正确性校验，一致性校验，完整性校验
        let teacherId = req.query.teacher_id ? req.query.teacher_id : -1;
        // 1.2 从请求中获取排序字段，若不存在则默认按id排序
        let orderBy = req.query.order_by ? req.query.order_by : "id";
        // 1.3 从请求中获取排序方式，若不存在则默认为降序
        let sort = req.query.sort ? req.query.sort : "desc";
        // 1.4 从请求中获取限制条数，若不存在则赋值为-1
        let limit = req.query.limit ? req.query.limit : -1;
        // 1.5 从请求中获取偏移量，若不存在则赋值为-1
        let offset = req.query.offset ? req.query.offset : -1;

        // 2. 访问数据
        // 2.1 获取数据库实例
        let db = CourseDB.getInstance();
        // 2.2 连接数据库
        await db.connect();
        // 2.3 调用数据库方法，按教师ID查找课程信息列表
        let result = await db.findAllByTeacherId(teacherId, orderBy, sort, limit, offset);

        // 3. 输出数据
        // 3.1 打印日志，记录获取课程信息列表的结果
        //await db.close();
        util.logFormat(`获取指定教师【${teacherId}】的课程信息列表%O`, result);
        // 3.2 将结果以JSON格式返回给客户端
        res.json(util.FormatJSONData(200, `获取指定教师的课程信息列表`, result));
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500, "服务器发生意外情况，无法完成请求！"));
    });
}



module.exports = {
    findAllByTeacherId,
    add,
    remove,
    update,
    find,
    findAll,
    getCount,
    search,
};